package karaoke.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import karaoke.excepcion.DAOExcepcion;
import karaoke.modelo.Evento;
import karaoke.util.ConexionBD;

public class EventoDAO extends BaseDAO {

	
	 public Evento insertar(Evento evento) throws DAOExcepcion {
	        String query = "INSERTO INTO evento (ID_EVENTO, NOMBRE,FECHA,CAPACIDAD,DESCRIPCION,ESTADO) values (?,?,?,?,?,?)";
	        Connection con = null;
	        PreparedStatement stmt = null;
	        ResultSet rs = null;
	        try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            stmt.setInt(1, evento.getID_EVENTO());
	            stmt.setString(2,evento.getNOMBRE ());
	            stmt.setDate(3, new java.sql.Date(evento.getFECHA().getTime()));
	            stmt.setFloat(4, evento.getCAPACIDAD());
	            stmt.setString(5, evento.getDESCRIPCION ());
	            stmt.setInt(6, evento.getESTADO());
	            
	            int i = stmt.executeUpdate();
	            if (i != 1) {
	                throw new SQLException("No se pudo insertar");
	            }
	            // Obtener el ultimo id
	            int id = 0;
	            query = "SELECT LAST_INSERT_ID()";
	            stmt = con.prepareStatement(query);

	            rs = stmt.executeQuery();

	            if (rs.next()) {
	                id = rs.getInt(1);
	            }
	            evento.setID_EVENTO(id);
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            this.cerrarResultSet(rs);
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	        }
	        return evento;
	    }
	

	 public Evento actualizar(Evento vo) throws DAOExcepcion {
			String query = "update evento set NOMBRE=?,CAPACIDAD =?,DESCRIPCION =?,ESTADO=? where NOMBRE=?";
			Connection con = null;
			PreparedStatement stmt = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(2, vo.getNOMBRE());
				stmt.setInt(3, vo.getCAPACIDAD());
				stmt.setString(4, vo.getDESCRIPCION());
				stmt.setInt(5, vo.getESTADO());	
			
							int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo actualizar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return vo;
		}
	  	 
	 public void eliminar(int iD_EVENTO) throws DAOExcepcion {
	        String query = "DELETE FROM evento WHERE ID_EVENTO = ?";
	        Connection con = null;
	        PreparedStatement stmt = null;
	        try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            stmt.setInt(1, iD_EVENTO);
	            
	            int i = stmt.executeUpdate();
	            if (i != 1) {
	                throw new SQLException("No se pudo eliminar");
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	        }
	    } 
	 
	 public Evento obtener(int ID_EVENTO) throws DAOExcepcion {
	        Evento evento = new Evento();
	        Connection con = null;
	        PreparedStatement stmt = null;
	        ResultSet rs = null;
	        try {
	            String query = "SELECT * FROM evento WHERE ID_EVENTO=?";
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            stmt.setInt(1, ID_EVENTO);
	            rs = stmt.executeQuery();
	            
	            if (rs.next()) {
	            	evento.setID_EVENTO(rs.getInt("ID_EVENTO"));
	                evento.setNOMBRE(rs.getString("NOMBRE"));
	                evento.setFECHA(rs.getDate("FECHA"));
	                evento.setCAPACIDAD(rs.getInt("cAPACIDAD"));
	                evento.setDESCRIPCION(rs.getString("DESCRIPCION"));
	                evento.setESTADO(rs.getInt("ESTADO"));
	                evento.setFK_ID_LOCAL(rs.getInt("fK_ID_LOCAL"));
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            this.cerrarResultSet(rs);
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	        }
	        return evento;
	    }
	 	
	   public List<Evento> buscarPorNombre(String nombre) throws DAOExcepcion {
	        String query = "SELECT * FROM evento WHERE nombre LIKE ?";
	        List<Evento> lista = new ArrayList<Evento>();
	        Connection con = null;
	        PreparedStatement stmt = null;
	        ResultSet rs = null;
	        try {
	            con = ConexionBD.obtenerConexion();
	            stmt = con.prepareStatement(query);
	            stmt.setString(1, "%" + nombre + "%");
	            rs = stmt.executeQuery();

	            while (rs.next()) {
	                Evento evento = new Evento();
	                evento.setID_EVENTO(rs.getInt("ID_EVENTO"));
	                evento.setFECHA(rs.getDate("FECHA"));
	                evento.setCAPACIDAD(rs.getInt("cAPACIDAD"));
	                evento.setDESCRIPCION(rs.getString("DESCRIPCION"));
	                evento.setESTADO(rs.getInt("ESTADO"));
	                evento.setFK_ID_LOCAL(rs.getInt("fK_ID_LOCAL"));
	                lista.add(evento);
	            }
	        } catch (SQLException e) {
	            System.err.println(e.getMessage());
	            throw new DAOExcepcion(e.getMessage());
	        } finally {
	            this.cerrarResultSet(rs);
	            this.cerrarStatement(stmt);
	            this.cerrarConexion(con);
	        }
	        System.out.println(lista.size());
	        return lista;
	    }
	 
}
